package library.frame;

import javax.swing.table.AbstractTableModel;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;

/**
 * User: RockCrazy
 * Date: 20.01.12
 * Time: 22:50
 */
public class DynamicTableModel extends AbstractTableModel
{
	// здесь мы будем хранить названия столбцов
	private ArrayList<String> columnNames = new ArrayList<String>();
	// список типов столбцов
	private ArrayList<Class> columnTypes = new ArrayList<Class>();
	// хранилище для полученных данных из базы данных
	private final ArrayList<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>();

	// конструктор позволяет задать возможность редактирования
	public DynamicTableModel(boolean editable)
	{
		this.editable = editable;
	}

	private boolean editable;

	// количество строк
	public int getRowCount()
	{
		synchronized (data)
		{
			return data.size();
		}
	}

	// количество столбцов
	public int getColumnCount()
	{
		return columnNames.size();
	}

	// тип данных столбца
	public Class getColumnClass(int column)
	{
		return columnTypes.get(column);
	}

	// название столбца
	public String getColumnName(int column)
	{
		return columnNames.get(column);
	}

	// данные в ячейке
	public Object getValueAt(int row, int column)
	{
		synchronized (data)
		{
			return (data.get(row)).get(column);
		}
	}

	// возможность редактирования
	public boolean isEditable(int row, int column)
	{
		return editable;
	}

	// замена значения ячейки
	public void setValueAt(Object value, int row, int column)
	{
		synchronized (data)
		{
			(data.get(row)).set(column, value);
		}
	}

	// получение данных из объекта ResultSet
	public void setDataSource(ResultSet rs) throws Exception
	{
		// удаляем прежние данные
		data.clear();
		columnNames.clear();
		columnTypes.clear();

		// получаем вспомогательную информацию о столбцах
		ResultSetMetaData rsmd = rs.getMetaData();

		int columnCount = rsmd.getColumnCount();

		for (int i = 0; i < columnCount; i++)
		{
			String columnName = rsmd.getColumnName(i + 1);

			// таблица reader
			if (columnName.equalsIgnoreCase("id_reader"))
			{
				columnName = "Номер регистрации";
			}
			if (columnName.equalsIgnoreCase("fam"))
			{
				columnName = "Фамилия";
			}
			if (columnName.equalsIgnoreCase("name"))
			{
				columnName = "Имя";
			}
			if (columnName.equalsIgnoreCase("otch"))
			{
				columnName = "Отчество";
			}
			if (columnName.equalsIgnoreCase("birthday"))
			{
				columnName = "День рождения";
			}
			if (columnName.equalsIgnoreCase("passport"))
			{
				columnName = "Паспорт";
			}
			if (columnName.equalsIgnoreCase("adress"))
			{
				columnName = "Адресс";
			}

			if (columnName.equalsIgnoreCase("phone"))
			{
				columnName = "Телефон";
			}

			// book
			if (columnName.equalsIgnoreCase("book_name"))
			{
				columnName = "Название";
			}
			if (columnName.equalsIgnoreCase("author"))
			{
				columnName = "Автор";
			}
			if (columnName.equalsIgnoreCase("izdatel"))
			{
				columnName = "Издательство";
			}
			if (columnName.equalsIgnoreCase("year_izdan"))
			{
				columnName = "Год издания";
			}
			if (columnName.equalsIgnoreCase("prim"))
			{
				columnName = "Примечание";
			}
			if (columnName.equalsIgnoreCase("oglav"))
			{
				columnName = "Оглавление";
			}
			// название столбца
			columnNames.add(columnName);
			// тип столбца
			Class type = Class.forName(rsmd.getColumnClassName(i + 1));
			columnTypes.add(type);
		}
		// сообщаем об изменениях в структуре данных
		fireTableStructureChanged();
		// получаем данные
		while (rs.next())
		{
			// здесь будем хранить ячейки одной строки
			ArrayList<Object> row = new ArrayList<Object>();
			for (int i = 0; i < columnCount; i++)
			{
				if (columnTypes.get(i) == String.class)
					row.add(rs.getString(i + 1));
				else
					row.add(rs.getObject(i + 1));
			}
			synchronized (data)
			{
				data.add(row);
				// сообщаем о прибавлении строки
				fireTableRowsInserted(data.size() - 1, data.size() - 1);
			}
		}
	}
}

